package main

import (
	"encoding/json"
	"fmt"
)

type NewInt int  // 自定义类型, 全新类型
type MyInt = int // 类型别名, 本质是同一个类型

// Person 结构体
// 字段可见性: 大写开头表示可公开访问, 小写表示私有（仅在定义当前结构体的包中可访问）
type Person struct {
	Name string `json:"name"` // Tag是结构体的元信息，可以在运行的时候通过反射的机制读取出来
	Age  int8   `json:"age"`
}

// Hello 结构体的方法
func (p *Person) Hello() {
	fmt.Printf("Hello, I'm %s, age is %d\n", p.Name, p.Age)
}

func main() {
	var a NewInt
	var b MyInt
	fmt.Printf("type of a: %T\n", a) // main.NewInt
	fmt.Printf("type of b: %T\n", b) // int

	// 结构体初始化
	var p1 = &Person{
		Name: "张三",
		Age:  23,
	}
	fmt.Printf("p1=%v\n", p1)  // p1={张三 42}
	fmt.Printf("p1=%#v\n", p1) // p1=main.Person{Name:"张三", Age:42}
	p1.Hello()

	// 序列化和反序列化
	data, err := json.Marshal(p1)
	if err != nil {
		fmt.Println("json marshal err:", err)
		return
	}
	fmt.Printf("json: %s\n", data)
	p2 := &Person{}
	err = json.Unmarshal(data, p2)
	if err != nil {
		fmt.Println("json unmarshal err:", err)
		return
	}
	fmt.Printf("p2=%#v\n", p2)
}
